自動運転シミュレータCARLAのROS2ネイティブ対応を試してみた
製造ビジネステクノロジー部の新澤です。
先進運転支援システム(ADAS)や自律走行車(AV)の開発において広く使われているオープンソースのシミュレーションツールであるCARLA Simulatorのver0.10.0がリリースされました。
AWS関連だと、昨年のre:Invent 2023でのAWS IoT FleetWiseのデモや、今年のre:Invent 2024でも生成AIとIoTを組み合わせたデモとして製造業向けブースでの展示にも使われていました。
今回のリリースでは、レンダリングエンジンがUnreal Engine 4.26から5.5へ移行され、画像のリアリティが向上するなど非常に大きなアップデートが行われていますが、その中でも私が注目したのはROS2のネイティブサポートです。
以前のバージョンまでは、ROS-bridgeというミドルウェアを別途実行することによって実現されていましたが、ネイティブサポートにより、カメラ画像やLiDERデータをROS2トピックに直接ブロードキャストすることができるようになりました。
今回は試せていませんが、昨年からAWS IoT FleetWiseでプレビュー提供されているビジョンシステムデータという機能は、カメラ画像やLiDERデータなどのデータをROS2トピック経由で取得する仕様になっているため、車両情報収集システムのテストのようなデータの準備が難しい作業が容易になりそうです。
今回は、CARLAシミュレータのROS2ネイティブサポートのデモを試してみた内容についてご紹介します。
1. EC2インスタンスの作成・起動
CARLAシミュレータの実行には、以下の条件を満たした環境が必要となります。
- OS: Windows 11 or Ubuntu 22.04
- GPU: NVIDIA RTX 3000シリーズ以上、メモリ16GB以上
- GPUドライバー:
- Ubuntu: NVIDIA RTX Driver 550以上
- Windows: NVIDIA RTX Driver 560以上
- ディスク容量: 130GB
また、GUIも必要になるので、NICE DCVサーバーもインストールします。
NICE DCVをインストールしたEC2インスタンスの作成については、以下の記事にてNICE DCVサーバー・クライアントの設定方法が紹介されていますので参照ください。
ただし、CDKスクリプトおよびEC2インスタンスのユーザーデータスクリプトについては、若干修正が必要なため、以下を参考にしてください。
- ユーザーデータスクリプト
NICE DCVサーバーのバージョンを2027.12.27現在の最新バージョンに変更しています。
# Linux NICE DCV サーバーの前提条件
# @see: https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/setting-up-installing-linux-prereq.html
## デスクトップ環境とデスクトップマネージャーをインストールする
### デスクトップ環境とデスクトップマネージャーをインストールする
sudo apt update
sudo apt install ubuntu-desktop -y
sudo apt install gdm3
### GDM3 を起動する(GDM3 がアクティブでない場合があるため)
sudo systemctl start gdm3
### GDM3 をデフォルトのデスクトップマネージャーに設定する
sudo dpkg-reconfigure gdm3
### ソフトウェアパッケージをインストールする
sudo apt upgrade -y
## Wayland プロトコルを無効にする
### [daemon] セクションで WaylandEnable を false に設定する
sudo sed -i -e "s/^#WaylandEnable=false/WaylandEnable=false/g" /etc/gdm3/custom.conf
### GDM サービスを再起動する
sudo systemctl restart gdm3
## X サーバーを設定する
### 確認コマンド:'graphical.target'が返ること(Linux サーバーの起動時に X サーバーが自動起動すること)を確認する
sudo systemctl get-default
### X サーバーを再起動する
sudo systemctl isolate graphical.target
### 確認コマンド:出力があること(Xサーバーが実行中であること)を確認する
ps aux | grep X | grep -v grep
## glxinfo ユーティリティをインストールする
sudo apt install mesa-utils -y
## グラフィックスインスタンス用の GPU ドライバーをインストールする
### NVIDIA GPU ドライバーをインストールする
### インストール済みの AMI を使用しているため不要
### 確認コマンド:出力があること(NVIDIA GPU ドライバーがインストールされていること)を確認する
### @see: https://dev.classmethod.jp/articles/monitor-nvidia-gpu-usage-with-nvidia-smi-nvsmi/
nvidia-smi
### xorg.conf ファイルを生成する
sudo nvidia-xconfig --preserve-busid --enable-all-gpus
### X サーバーを再起動して、変更を有効にする
sudo systemctl isolate multi-user.target
sudo systemctl isolate graphical.target
### 確認コマンド:出力があること(OpenGL ハードウェアレンダリングが利用可能であること)を確認する
sudo DISPLAY=:0 XAUTHORITY=$(ps aux | grep "X.*\-auth" | grep -v grep | sed -n 's/.*-auth \([^ ]\+\).*/\1/p') glxinfo | grep -i "opengl.*version"
# Linux に NICE DCV サーバーをインストールする
# @see: https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/setting-up-installing-linux-server.html
## NICE DCV の作業ディレクトリを作成して移動する
mkdir -p /home/ubuntu/dcv && cd $_
## NICE GPG キーをインポートする
wget https://d1uj6qtbmh3dt5.cloudfront.net/NICE-GPG-KEY
gpg --import NICE-GPG-KEY
## NICE DCV パッケージをダウンロードする
wget https://d1uj6qtbmh3dt5.cloudfront.net/2024.0/Servers/nice-dcv-2024.0-18131-ubuntu2204-x86_64.tgz
## .tgz アーカイブのコンテンツを抽出し、抽出されたディレクトリに移動する
tar -xvzf nice-dcv-2024.0-18131-ubuntu2204-x86_64.tgz && cd nice-dcv-2024.0-18131-ubuntu2204-x86_64
## NICE DCV サーバーをインストールする
sudo apt install ./nice-dcv-server_2024.0.18131-1_amd64.ubuntu2204.deb
## dcv ユーザーを video グループに追加
sudo usermod -aG video dcv
## ホームディレクトリに戻り、ダウンロードした .tgz アーカイブを削除する
cd /home/ubuntu
# sudo rm dcv/nice-dcv-2024.0-17979-ubuntu2404-x86_64.tgz
# インストール後のチェック
# @see: https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/setting-up-installing-linux-checks.html
## X サーバーがアクセス可能であることを確認する
### X サーバーを再起動する
sudo systemctl isolate multi-user.target
sudo systemctl isolate graphical.target
### 確認コマンド: "SI:localuser:dcv" が返ることを確認する
sudo DISPLAY=:0 XAUTHORITY=$(ps aux | grep "X.*\-auth" | grep -v grep | sed -n 's/.*-auth \([^ ]\+\).*/\1/p') xhost | grep "SI:localuser:dcv$"
# NICE DCV サーバー が Linux で自動的に起動するように設定する
# @see: https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/manage-start.html
sudo systemctl enable dcvserver
# 自動コンソールセッションの有効化
# @see: https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/managing-sessions-start.html#managing-sessions-start-auto
## Linux NICE DCV サーバー で自動コンソールセッションを有効にする
sudo sed -i -e "s/^#create-session/create-session/g" /etc/dcv/dcv.conf
sudo sed -i -e "s/^#owner = \"\"/owner = \"ubuntu\"/g" /etc/dcv/dcv.conf
## NICE DCV サービスを再起動する
sudo systemctl restart dcvserver
## 確認コマンド: 'console' セッションが作成されていることを確認する
dcv list-sessions
- CDKスクリプト
EC2インスタンスの定義のみ記載していますので、上記参考記事の該当部分と差し替えてください。
インスタンスサイズをg4dn.2xlarge、ディスク容量を200GBに変更しています。
デフォルトのディスクサイズでは、後述のzipファイル展開の途中でディスク容量不足になります。
また、インスタンスサイズも2xlarge以上でないと、CARLAシミュレータの挙動が不安定になります。(2xlargeでも若干重いですがなんとか動きます)
AMI IDは、"Deep Learning Base OSS Nvidia Driver GPU AMI (Ubuntu 22.04)"をAMIカタログで検索し、AMI IDを確認してください。下記サンプルではus-east-1リージョンのAMI IDを使用していますので、ご利用のリージョンが異なる場合は変更してください。
// AMI ID
const instanceAmiId = 'ami-0472e369a78a2dd1c';
// EC2インスタンスの作成
const instance = new ec2.Instance(this, 'MyEC2Instance', {
vpc,
vpcSubnets: {
subnetType: ec2.SubnetType.PUBLIC,
},
instanceType: ec2.InstanceType.of(ec2.InstanceClass.G4DN, ec2.InstanceSize.XLARGE2),
machineImage: ec2.MachineImage.genericLinux({
[region]: instanceAmiId,
}),
associatePublicIpAddress: true,
ssmSessionPermissions: true,
securityGroup: securityGroup,
requireImdsv2: true,
blockDevices: [
{
deviceName: '/dev/sda1',
volume: ec2.BlockDeviceVolume.ebs(200),
},
],
});
- (オプション) NICE DCV サーバーの解像度変更の有効化
DCV ViewerでEC2インスタンスに接続した際に、解像度が800x600になってしまう場合は、/etc/dcv/dcv.conf
に以下の行を追加することで、DCV Viewer側で解像度を変更することができるようになります。
[display/linux]
enable-console-scaling = true
設定した後は、NICE DCV サーバーを再起動してからDCV ViewerでEC2インスタンスに接続してください。
$ sudo systemctl restart dcvserver
2. CARLAのダウンロード
CARLAシミュレータのファイルをダウンロードします。
ターミナルで以下のコマンドを実行してください。
$ cd ~/
$ wget https://carla-releases.s3.us-east-005.backblazeb2.com/Linux/Carla-0.10.0-Linux-Shipping.zip
$ unzip Carla-0.10.0-Linux-Shipping.zip
3. CARLAサーバーの起動
ROS2オプションを有効にしてCARLAサーバーを起動します。
$ cd ~/Carla-0.10.0-Linux-Shipping
$ ./CarlaUnreal.sh --ros2
ウィンドウに画像が表示されるまで、若干待ちます。
4. CARLAクライアントパッケージのインストール
別途ターミナルを開いて、pipでwhlファイルをインストールします。
$ cd ~/Carla-0.10.0-Linux-Shipping/PythonAPI
$ pip install carla/dist/carla-0.10.0-cp310-cp310-linux_x86_64.whl
5. トラフィック生成スクリプトの実行
ROS2サンプルスクリプトを実行する前に、自車以外の車両や歩行者をワールドに生成しておきます。(自車だけだと非常に寂しいので…)
$ cd examples
$ python3 generate_traffic.py
spawned 30 vehicles and 10 walkers, press Ctrl+C to exit.
スクリプトを実行すると、デフォルトで車両30台、歩行者10人が生成されます。CARLAサーバーの画面を眺めていると、生成された車両が走行しているのが見えると思います。
6. ROS2サンプルスクリプトの実行
ROS2サンプルスクリプトを実行します。このスクリプトでは特にウィンドウは表示されないので、Running...
と表示されたらOKです。
$ cd ros2
$ python3 ros2_native.py -f stack.json
INFO: Listening to server localhost:2000
INFO: Running...
7. rviz2 の起動
ROS2サンプルスクリプトで有効化されてROS2トピックにブロードキャストされているセンサーデータを可視化するために、rviz2を起動します。
$ ./run_rviz.sh
ROS2トピックから取得されたカメラ画像とLiDERデータが確認できます。自車周辺に他車や障害物があるときLiDERデータにも反映されていることが確認できます。
8. 参考
9. おわりに
CARLAシミュレータのROS2ネイティブサポートのデモを試してみました。
デモのサンプルコードを確認すると、非常に簡単にROS2トピックにセンサーデータをブロードキャストできることがわかりました。
自動運転関連の開発のみでなく、モビリティ関連サービスなどの開発におけるテストやシミュレーションなどの効率化への効果も期待できそうです。